#include <iostream>
#include <future>

using std::cout;
using std::endl;

int main(void)
{
    std::future<int> f1 = std::async(std::launch::async, [](){return 8;});
    cout << f1.get() << endl; //当共享状态准备好时，返回存储在共享状态中的值（或抛出其异常）。 
                             //如果共享状态尚未准备好（即，提供者尚未设置其值或异常），则该函数将阻塞调用线程并等待它准备好。
                             //一旦共享状态准备好，函数就会解除阻塞并返回（或抛出）释放其共享状态。
    std::future<void>  f2 = std::async(std::launch::async, [](){
            cout << 8 << endl;
            return;
            });
    f2.wait(); //等待共享状态准备就绪。 如果共享状态尚未准备好（即，提供者尚未设置其值或异常），
            //则该函数将阻塞调用线程并等待它准备好。 
            //一旦共享状态准备好，函数就会解除阻塞并返回，而不读取它的值，也不抛出它的设置异常（如果有）。
            //所有可见的副作用在提供者准备共享状态和返回此函数之间同步

    std::future<int> future = std::async(std::launch::async, [](){
            std::this_thread::sleep_for(std::chrono::seconds(3));
            return 8;
            });
    cout << "wait... \n";
    std::future_status status;

    do{
        status = future.wait_for(std::chrono::seconds(1));
        switch(status)
        {
            case std::future_status::deferred:
                cout << "deferred \n";
                break;
            case std::future_status::timeout:
                cout << "timeout \n";
                break;
            case std::future_status::ready:
                cout << "ready! \n";
                break;
            default: 
                break;
        }
    }while(status != std::future_status::ready);

    cout << "resulit is " << future.get() << endl;
    return 0;
}
